//
// Created by 小演员的MacBook on 2024/6/24.
//

#include <iostream>//导入iostream模块

using namespace std;//选用命名空间std

int main() {

//    system("ls -l");
    //endl：输出一个换行
    cout << "Hello World!!!" << endl;
    cout << sizeof(long) << endl;

    u_int num1 = 100;//无符号快捷写法

    cout << fixed;//设置为小数显示
    cout.width(20);//设置显示的最大宽度（最大位数）
    cout << 123456789.0f << endl;//打印结果是：    123456792.000000；只提供了前7位的准确输出，丢失了精度；
    cout.width(20);//设置显示的最大宽度（最大位数）
    cout << 1.23456789 << endl;//打印结果是：            1.234568；只提供了前7位的准确输出（包含小数点），丢失了精度；默认应该是double类型，为什么精度才7位呢？
    cout << sizeof 123456789.0f << endl;
    cout << sizeof 1.23456789 << endl;

    //C语言风格 定义字符串
    char str1[] = "aaa";
    char *str2 = "bbb";
    cout << "str1=" << sizeof str1 << endl;//其实就是个数组，所以大小是4
    cout << "str2=" << sizeof str2 << endl;//其实是个指针，所以大小是8
    cout << "str2=" << strlen(str1) << endl;//长度是3
    cout << "str2=" << strlen(str2) << endl;//长度是3

    //C++风格 定义字符串
    string str3 = "ccc";

    //+号仅适用于字符串之间的拼接，如果是非字符串，需要将内容转换为字符串。
    string str4 = "aaa" + str3 + to_string(15.0) + to_string(100);
    cout << str4 << endl;

    //定义布尔型
    bool flag = true;
    cout << flag << endl;

    //cin >> 变量
    int num;
//    cin >> num;
    cout << num << endl;
    string str;
//    cin >> str;
    cout << str << endl;

    //枚举：枚举类型每一个元素，都有整数标号，默认从0开始递增，也可以手动赋值。
    enum Season {
        SPRING, SUMMER, AUTUMN, WINTER
    };

    //动态分配内存；养成良好习惯，分配完内存立刻就写好释放内存的代码。
    int *p = new int;
    *p = 100;
    cout << *p << endl;
    delete p;//释放内存
    p = nullptr;//防止指针悬挂（野指针）

    int *p1 = new int[5];
    p1[0] = 1;
    *p1 = 2;
    p1[1] = 3;
    *(p1 + 2) = 4;
    p1[3] = 5;
    p1[4] = 6;
    for (int i = 0; i < 5; i++) {
        cout << p1[i] << endl;
    }
    delete[] p1;//释放内存
    p1 = nullptr;//防止指针悬挂（野指针）

    const int ci = 10;
    int ci1 = 1;
    const int *cpi = &ci;//指针指向常量，不能修改指针指向的内容，但是可以修改指针变量。
    cpi = &ci1;//可以修改指针指向的内容，但是不能修改指针指向的内容所指向的内容。
    ci1 = 2;
    cout << *cpi << endl;
    const int * const cpi1 = &ci;//指针指向常量，不能修改指针指向的内容，也不能修改指针变量的内容。
    cout << *cpi1 << endl;

    //结构体
    struct Student {
        string name;
        int age;
        int score;
    };
    struct Student stu1 = {"小明", 18, 100};//由编译器自动分配内存
    struct Student *stu2 = new Student {"小明", 18, 100};//手动分配内存；动态分配内存
    cout << stu2->name << endl;
    cout << stu2->age << endl;
    cout << stu2->score << endl;
    delete stu2;

    struct Student *stu3 = new Student[4] {
            {"小明", 18, 100},
            {"小明", 18, 100},
            {"小明", 18, 100},
            {"小明", 18, 100}
    };
    cout << stu3[0].name << endl;
    cout << stu3 -> name << endl;
    cout << stu3[1].age << endl;
    cout << (stu3 + 1) -> age << endl;
    cout << stu3[2].score << endl;
    delete[] stu3;

    //引用；引用的本质 就是一个常量指针。
    int num2 = 200;
    int &num3 = num2;//编译器自动转换为int *const num3 = &num2;指针常量是指针指向不可改。
    int const &num4 = num2;//常量引用。
    const int &num5 = 10;//加上const之后，编译器将代码修改为：int temp = 10;const int &num5 = temp;
    cout << num3 << endl;
    num3 = 300;//内部发现num3是引用，自动帮我们转换为*num3 = 300;
    cout << &num2 << endl;
    cout << &num5 << endl;

    int *pInt = new int(100);
    cout << *pInt << endl;
    delete pInt;
    pInt = &num3;
    cout << *pInt << endl;
    int *&num6 = pInt;//指针是对象，所以存在对指针的引用
//    int &*num6 = pInt;//引用本身不是一个对象，因此不能定义指向引用的指针。
    cout << num6 << endl;

    //编译器定义的变量
    std::cout << __func__ << std::endl;//存放了函数的名字
    std::cout << __FILE__ << std::endl;//存放了文件名
    std::cout << __LINE__ << std::endl;//存放了行号
    std::cout << __DATE__ << std::endl;//存放了编译日期
    std::cout << __TIME__ << std::endl;//存放了编译时间
    return 0;
}